5 // Created by David Smith on 5/9/07.
6 // Copyright 2007 __MyCompanyName__. All rights reserved.
9 #import "AIWebKitDelegate.h"
10 #import "AIWebKitMessageViewController.h"
13 static AIWebKitDelegate *AISharedWebKitDelegate;
15 @implementation AIWebKitDelegate
19 if((self = [super init]))
21 mapping = [[NSMutableDictionary alloc] init];
26 + (AIWebKitDelegate *)sharedWebKitDelegate
28 if(!AISharedWebKitDelegate)
29 AISharedWebKitDelegate = [[self alloc] init];
30 return AISharedWebKitDelegate;
33 - (void) addDelegate:(AIWebKitMessageViewController *)controller forView:(ESWebView *)webView
35 [mapping setObject:controller forKey:[NSValue valueWithPointer:webView]];
37 [webView setFrameLoadDelegate:self];
38 [webView setPolicyDelegate:self];
39 [webView setUIDelegate:self];
40 [webView setDraggingDelegate:self];
42 // [[webView windowScriptObject] setValue:self forKey:@"client"];
44 - (void) removeDelegate:(AIWebKitMessageViewController *)controller
46 ESWebView *webView = (ESWebView *)[controller messageView];
48 [webView setFrameLoadDelegate:nil];
49 [webView setPolicyDelegate:nil];
50 [webView setUIDelegate:nil];
51 [webView setDraggingDelegate:nil];
53 [mapping removeObjectForKey:[NSValue valueWithPointer:webView]];
56 //WebView Delegates ----------------------------------------------------------------------------------------------------
57 #pragma mark Webview delegates
59 * @brief Invoked once the webview has loaded and is ready to accept content
61 - (void)webView:(ESWebView *)sender didFinishLoadForFrame:(WebFrame *)frame
63 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
65 //Flag the view as ready (as soon as the current methods exit) so we know it's now safe to add content
66 [controller performSelector:@selector(webViewIsReady) withObject:nil afterDelay:0.00001];
69 //We don't care about any further didFinishLoad notifications
70 [sender setFrameLoadDelegate:nil];
74 * @brief Prevent the webview from following external links. We direct these to the user's web browser.
76 - (void)webView:(ESWebView *)sender
77 decidePolicyForNavigationAction:(NSDictionary *)actionInformation
78 request:(NSURLRequest *)request
79 frame:(WebFrame *)frame
80 decisionListener:(id<WebPolicyDecisionListener>)listener
82 int actionKey = [[actionInformation objectForKey: WebActionNavigationTypeKey] intValue];
83 if (actionKey == WebNavigationTypeOther) {
86 NSURL *url = [actionInformation objectForKey:WebActionOriginalURLKey];
88 //Ignore file URLs, but open anything else
89 if (![url isFileURL]) {
90 [[NSWorkspace sharedWorkspace] openURL:url];
98 * @brief Append our own menu items to the webview's contextual menus
100 - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
102 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
104 return [controller webView:sender contextMenuItemsForElement:element defaultMenuItems:defaultMenuItems];
105 return defaultMenuItems;
109 * @brief Dragging entered
111 - (NSDragOperation)webView:(ESWebView *)sender draggingEntered:(id <NSDraggingInfo>)info
113 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
114 NSLog(@"%@", controller);
115 return controller ? [controller draggingEntered:info] : NSDragOperationNone;
119 * @brief Dragging updated
121 - (NSDragOperation)webView:(ESWebView *)sender draggingUpdated:(id <NSDraggingInfo>)info
123 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
124 return controller ? [controller draggingUpdated:info] : NSDragOperationNone;
128 * @brief Handle a drag onto the webview
130 * If we're getting a non-image file, we can handle it immediately. Otherwise, the drag is the textView's problem.
132 - (BOOL)webView:(ESWebView *)sender performDragOperation:(id <NSDraggingInfo>)info
134 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
135 return controller ? [controller performDragOperation:info] : NO;
139 * @brief Pass on the prepareForDragOperation if it's not one we're handling in this class
141 - (BOOL)webView:(ESWebView *)sender prepareForDragOperation:(id <NSDraggingInfo>)info
143 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
144 return controller ? [controller prepareForDragOperation:info] : NO;
148 * @brief Pass on the concludeDragOperation if it's not one we're handling in this class
150 - (void)webView:(ESWebView *)sender concludeDragOperation:(id <NSDraggingInfo>)info
152 AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
154 [controller concludeDragOperation:info];
157 - (BOOL)webView:(ESWebView *)sender shouldHandleDragWithPasteboard:(NSPasteboard *)pasteboard
159 //AIWebKitMessageViewController *controller = [mapping objectForKey:[NSValue valueWithPointer:sender]];
160 //return controller ? [controller shouldHandleDragWithPasteboard:pasteboard] : NO;